<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\DB;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('api_documentation', function (Blueprint $table) {
            $table->id();
            $table->timestamps();

            // API基本信息
            $table->string('api_name', 200); // API名称
            $table->string('api_code', 100)->unique(); // API编码
            $table->string('http_method', 10); // HTTP方法：GET, POST, PUT, DELETE, PATCH
            $table->string('endpoint', 200); // API端点
            $table->string('version', 20)->default('v1'); // API版本
            $table->string('module', 50); // 所属模块

            // API描述
            $table->text('description'); // API描述
            $table->text('summary')->nullable(); // API摘要
            $table->json('tags')->nullable(); // 标签

            // 请求信息
            $table->json('request_headers')->nullable(); // 请求头
            $table->json('path_parameters')->nullable(); // 路径参数
            $table->json('query_parameters')->nullable(); // 查询参数
            $table->json('request_body')->nullable(); // 请求体
            $table->json('request_examples')->nullable(); // 请求示例

            // 响应信息
            $table->json('response_headers')->nullable(); // 响应头
            $table->json('success_responses')->nullable(); // 成功响应
            $table->json('error_responses')->nullable(); // 错误响应
            $table->json('response_examples')->nullable(); // 响应示例

            // 权限信息
            $table->json('required_permissions')->nullable(); // 所需权限
            $table->string('authentication_type', 50)->default('bearer'); // 认证类型
            $table->boolean('is_public')->default(false); // 是否公开接口
            $table->json('rate_limits')->nullable(); // 频率限制

            // 状态管理
            $table->string('status', 20)->default('active'); // 状态：active, deprecated, retired
            $table->boolean('is_deprecated')->default(false); // 是否已弃用
            $table->datetime('deprecated_at')->nullable(); // 弃用时间
            $table->string('replacement_api', 100)->nullable(); // 替代API

            // 版本控制
            $table->integer('api_version')->default(1); // API版本号
            $table->datetime('published_at')->nullable(); // 发布时间
            $table->string('published_by', 100)->nullable(); // 发布人

            // 分类信息
            $table->string('category', 50); // 分类：auth, user, employee, etc.
            $table->string('subcategory', 50)->nullable(); // 子分类
            $table->integer('priority')->default(1); // 优先级

            // 测试信息
            $table->json('test_cases')->nullable(); // 测试用例
            $table->boolean('has_tests')->default(false); // 是否有测试
            $table->string('test_coverage', 20)->nullable(); // 测试覆盖率

            // 性能信息
            $table->decimal('avg_response_time', 8, 2)->nullable(); // 平均响应时间（ms）
            $table->integer('success_rate')->nullable(); // 成功率（百分比）
            $table->integer('daily_calls')->default(0); // 日调用次数

            // 变更历史
            $table->json('changelog')->nullable(); // 变更日志
            $table->datetime('last_updated')->nullable(); // 最后更新时间
            $table->string('last_updated_by', 100)->nullable(); // 最后更新人

            // 相关信息
            $table->json('related_apis')->nullable(); // 相关API
            $table->json('dependencies')->nullable(); // 依赖项
            $table->text('notes')->nullable(); // 备注
            $table->json('attachments')->nullable(); // 附件

            // 创建者信息
            $table->string('created_by', 100)->nullable();
            $table->string('updated_by', 100)->nullable();

            // 索引
            $table->index(['module', 'status'], 'ad_module_status_idx');
            $table->index(['http_method'], 'ad_method_idx');
            // $table->index([DB::raw('endpoint(255)')], 'ad_endpoint_idx'); // 移除有问题的索引
            $table->index(['category', 'subcategory'], 'ad_category_idx');
            $table->index(['version'], 'ad_version_idx');
            $table->index(['status'], 'ad_status_idx');
            $table->index(['is_public'], 'ad_public_idx');
            $table->index(['api_code'], 'ad_code_idx');

            // 唯一约束：同一版本的同一端点只能有一种HTTP方法
            $table->unique(['endpoint', 'http_method', 'version'], 'unique_endpoint_method_version');
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('api_documentation');
    }
};
